package com.akjava.gwt.three.client.java.ui;
import com.akjava.gwt.html5.client.file.ui.DropVerticalPanelBase;
import com.akjava.gwt.lib.client.LogUtils;
import com.akjava.gwt.stats.client.Stats;
import com.akjava.gwt.three.client.gwt.renderers.WebGLRendererParameter;
import com.akjava.gwt.three.client.gwt.ui.RendererBuilder;
import com.akjava.gwt.three.client.js.THREE;
import com.akjava.gwt.three.client.js.renderers.WebGLRenderer;
import com.akjava.gwt.three.client.js.renderers.WebGLRenderer.WebGLCanvas;
import com.google.gwt.animation.client.AnimationScheduler;
import com.google.gwt.animation.client.AnimationScheduler.AnimationCallback;
import com.google.gwt.animation.client.AnimationScheduler.AnimationHandle;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.DoubleClickEvent;
import com.google.gwt.event.dom.client.DoubleClickHandler;
import com.google.gwt.event.dom.client.DragLeaveEvent;
import com.google.gwt.event.dom.client.DragLeaveHandler;
import com.google.gwt.event.dom.client.DragOverEvent;
import com.google.gwt.event.dom.client.DragOverHandler;
import com.google.gwt.event.dom.client.DropEvent;
import com.google.gwt.event.dom.client.DropHandler;
import com.google.gwt.event.dom.client.HasDragLeaveHandlers;
import com.google.gwt.event.dom.client.HasDragOverHandlers;
import com.google.gwt.event.dom.client.HasDropHandlers;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseMoveHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.dom.client.MouseUpHandler;
import com.google.gwt.event.dom.client.MouseWheelEvent;
import com.google.gwt.event.dom.client.MouseWheelHandler;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.Window.ScrollEvent;
import com.google.gwt.user.client.Window.ScrollHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.google.gwt.user.client.ui.TabLayoutPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
/**
* TODO move somewhere this is totall not part of three.js
* Entry point classes define <code>onModuleLoad()</code>.
*/
public abstract class TabDemoEntryPoint implements EntryPoint , AnimationCallback{
protected WebGLRenderer renderer;
protected AnimationHandle animationHandler;
protected Stats stats;
protected WebGLCanvas canvas;
private PopupPanel dialog;
private Button hideButton;
protected DropVerticalPanelBase main;
protected int canvasWidth,canvasHeight;
protected TabLayoutPanel tabPanel;
protected int tabHeight=24;
protected PopupPanel popupPanel;
public WebGLCanvas getCanvas() {
return canvas;
}
public abstract void onDoubleClick(DoubleClickEvent event);
public abstract void onMouseClick(ClickEvent event);
public abstract void onMouseWheel(MouseWheelEvent event);
public abstract void onMouseMove(MouseMoveEvent event) ;
public abstract void onMouseDown(MouseDownEvent event) ;
public abstract void onMouseUp(MouseUpEvent event) ;
public abstract void onMouseOut(MouseOutEvent event);
public abstract void update(WebGLRenderer renderer);
public abstract void initialize(WebGLRenderer renderer,int width,int height);
public abstract void resized(int width,int height);
public class TabLayoutPanelWithDragAndDrop extends TabLayoutPanel implements HasDropHandlers, HasDragOverHandlers,
HasDragLeaveHandlers{
public TabLayoutPanelWithDragAndDrop(double barHeight, Unit barUnit) {
super(barHeight, barUnit);
// TODO Auto-generated constructor stub
}
/**
*
*/
@Override
public HandlerRegistration addDropHandler(DropHandler handler) {
return addBitlessDomHandler(handler, DropEvent.getType());
}
@Override
public HandlerRegistration addDragOverHandler(DragOverHandler handler) {
return addBitlessDomHandler(handler, DragOverEvent.getType());
}
@Override
public HandlerRegistration addDragLeaveHandler(DragLeaveHandler handler) {
return addBitlessDomHandler(handler, DragLeaveEvent.getType());
}
public HandlerRegistration addMouseWheelHandler(MouseWheelHandler handler) {
return addDomHandler(handler, MouseWheelEvent.getType());
}
}
protected void onDrop(DropEvent event){
event.preventDefault();
}
protected void onDragOver(DragOverEvent event){
event.preventDefault();
}
protected void onDragLeave(DragLeaveEvent event){
event.preventDefault();
}
public void onModuleLoad() {
/*
DropVerticalPanelBase rootPanel=new DropVerticalPanelBase();
rootPanel.setSize("100%", "100%");
//RootLayoutPanel.get().add(rootPanel);
*/
//support drag and drop anywhere
tabPanel = new TabLayoutPanelWithDragAndDrop(tabHeight, Unit.PX);
((TabLayoutPanelWithDragAndDrop)tabPanel).addDropHandler(new DropHandler() {
@Override
public void onDrop(DropEvent event) {
TabDemoEntryPoint.this.onDrop(event);
}
});
((TabLayoutPanelWithDragAndDrop)tabPanel).addDragOverHandler(new DragOverHandler() {
@Override
public void onDragOver(DragOverEvent event) {
TabDemoEntryPoint.this.onDragOver(event);
}
});
((TabLayoutPanelWithDragAndDrop)tabPanel).addDragLeaveHandler(new DragLeaveHandler() {
@Override
public void onDragLeave(DragLeaveEvent event) {
TabDemoEntryPoint.this.onDragLeave(event);
}
});
RootLayoutPanel.get().add(tabPanel);
int width=Window.getClientWidth();
int height=Window.getClientHeight()-tabHeight;
/**
*
* if
com.google.gwt.core.client.JavaScriptException: (TypeError): Cannot read property 'WebGLRenderer' of undefined
add lines and both js files on same directory with html
<script type="text/javascript" language="javascript" src="Three.js"></script>
<script type="text/javascript" language="javascript" src="stats.js"></script>
*/
//renderer = RendererBuilder.createRenderer();//stop using it cant' contain args
renderer = THREE.WebGLRenderer(WebGLRendererParameter.create().alpha(true));
//renderer = THREE.WebGLRenderer(GWTRenderObject.create().preserveDrawingBuffer()); //crash browser?
renderer.setSize(width,height);
//renderer.setClearColorHex(0x333333, 1);
//RootLayoutPanel.get().setStyleName("transparent");
canvas = new WebGLCanvas(renderer);
//canvas.setClearColorHex(0);
//final FocusPanel glCanvas=new FocusPanel(canvas);
canvas.addMouseUpHandler(new MouseUpHandler() {
@Override
public void onMouseUp(MouseUpEvent event) {
TabDemoEntryPoint.this.onMouseUp(event);
}
});
canvas.addDoubleClickHandler(new DoubleClickHandler() {
@Override
public void onDoubleClick(DoubleClickEvent event) {
TabDemoEntryPoint.this.onDoubleClick(event);
}
});
canvas.addMouseWheelHandler(new MouseWheelHandler() {
@Override
public void onMouseWheel(MouseWheelEvent event) {
TabDemoEntryPoint.this.onMouseWheel(event);
}
});
//hpanel.setFocus(true);
canvas.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
TabDemoEntryPoint.this.onMouseClick(event);
}
});
canvas.addMouseDownHandler(new MouseDownHandler() {
@Override
public void onMouseDown(MouseDownEvent event) {
TabDemoEntryPoint.this.onMouseDown(event);
}
});
canvas.addMouseOutHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent event) {
TabDemoEntryPoint.this.onMouseOut(event);
}
});
canvas.addMouseMoveHandler(new MouseMoveHandler(){
@Override
public void onMouseMove(MouseMoveEvent event) {
TabDemoEntryPoint.this.onMouseMove(event);
}});
//canvas.setStyleName("clear");
//glCanvas.getElement().getStyle().setBackgroundColor("#fff");
canvas.setWidth("100%");
canvas.setHeight("100%");
tabPanel.add(canvas,getTabTitle());
//tabPanel.add(new Label("hello"),"test");
//RootLayoutPanel.get().add(canvas);
canvasWidth=width;
canvasHeight=height;
//log("initialize:"+width+"x"+height);
initialize(renderer,width,height);
stats = Stats.insertStatsToRootPanel();
stats.setPosition(0, 30);//for tab header
dialog = new PopupPanel();
VerticalPanel dialogRoot=new VerticalPanel();
dialogRoot.setSpacing(2);
//dialog.setStyleName("transparent");
Label label=new Label("Control");
label.setStyleName("title");
dialog.add(dialogRoot);
dialogRoot.add(label);
main = new DropVerticalPanelBase();
main.setVisible(false);
main.addDropHandler(new DropHandler() {
@Override
public void onDrop(DropEvent event) {
TabDemoEntryPoint.this.onDrop(event);
}
});
main.addDragOverHandler(new DragOverHandler() {
@Override
public void onDragOver(DragOverEvent event) {
TabDemoEntryPoint.this.onDragOver(event);
}
});
main.addDragLeaveHandler(new DragLeaveHandler() {
@Override
public void onDragLeave(DragLeaveEvent event) {
TabDemoEntryPoint.this.onDragLeave(event);
}
});
HorizontalPanel hPanel=new HorizontalPanel();
hPanel.setWidth("100%");
hPanel.setHorizontalAlignment(HorizontalPanel.ALIGN_RIGHT);
dialogRoot.add(hPanel);
hideButton = new Button("Hide Control");
hideButton.setVisible(false);
hideButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
main.setVisible(false);
hideButton.setVisible(false);
rightTop(dialog);
}
});
hPanel.add(hideButton);
dialogRoot.add(main);
label.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
showControl();
}
});
createControl(main);
dialog.show();
rightTop(dialog);
Window.addResizeHandler(new ResizeHandler() {
@Override
public void onResize(ResizeEvent event) {
//int w=canvas.getOffsetWidth();
//int h=canvas.getOffsetHeight()-tabHeight;
int w=Window.getClientWidth();
int h=Window.getClientHeight()-tabHeight;
if(w<=0 || h<=0){
//log("ignore 0 resize");
return;
}
canvasWidth=w;
canvasHeight=h;
resized(w,h);
renderer.setSize(w, h);
rightTop(dialog);
}
});
Window.addWindowScrollHandler(new ScrollHandler() {
@Override
public void onWindowScroll(ScrollEvent event) {
//log("scroll:"+event.getScrollLeft()+"x"+event.getScrollTop());
}
});
HTMLPanel html=new HTMLPanel(getHtml());
html.setWidth("100%");
html.setHeight("20px");
html.setStyleName("text");
popupPanel = new PopupPanel();
popupPanel.add(html);
popupPanel.setPopupPosition(150, 35);
popupPanel.setWidth("100%");
popupPanel.setStyleName("transparent");
popupPanel.show();
execute(System.currentTimeMillis());
}
private boolean debugAnimateOneTime;
private int maxAnimateCount;
private int animated;
public void execute(double timestamp) {
if(!debugAnimateOneTime){//for debug,if error happen on animate
animationHandler=AnimationScheduler.get().requestAnimationFrame(this);
}else{
LogUtils.log("debugAnimateOneTime:true only render called one time for debug");
}
if(maxAnimateCount!=0 && animated>=maxAnimateCount){
maxAnimateCount++;
return;
}
update(renderer);
//stats.update();//stop stats for freeze possibility
}
protected void showControl(){
main.setVisible(true);
hideButton.setVisible(true);
rightTop(dialog);
}
protected void hideControl(){
main.setVisible(false);
hideButton.setVisible(false);
}
public String getHtml(){
return "Created with <a href='https://github.com/mrdoob/three.js/'>Three.js</a> & <a href='http://code.google.com/intl/en/webtoolkit/'>GWT</a>";
}
public abstract void createControl(DropVerticalPanelBase parent);
public abstract String getTabTitle();
private void rightTop(PopupPanel dialog){
int w=Window.getClientWidth();
int h=Window.getScrollTop();
int dw=dialog.getOffsetWidth();
//GWT.log(w+"x"+h+" offset="+dialog.getOffsetWidth());
dialog.setPopupPosition(w-dw-18, h);
}
protected void leftBottom(PopupPanel dialog){
int w=Window.getClientWidth();
int h=Window.getClientHeight();
int dw=dialog.getOffsetWidth();
int dh=dialog.getOffsetHeight();
//GWT.log(w+"x"+h+" offset="+dialog.getOffsetWidth());
//log("left-bottom:"+h+","+dh);
dialog.setPopupPosition(0, h-dh-tabHeight);//some error
}
}